package com.jh.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jh.dto.StoreCashierProductPageQueryDTO;
import com.jh.entity.PIdAndColor;
import com.jh.entity.PdIdAndSizeType;
import com.jh.entity.Product;
import com.jh.exception.BaseException;
import com.jh.mapper.ProductDetailMapper;
import com.jh.result.ListResult;
import com.jh.service.utils.SizeTypeUtil;
import com.jh.vo.PdIdAndSizeTypeVO;
import com.jh.vo.StoreCashierProductVO;
import com.jh.mapper.ProductMapper;
import com.jh.result.PageResult;
import com.jh.service.StoreCashierService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;


@Service
public class StoreCashierServiceImpl implements StoreCashierService {

    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private ProductDetailMapper productDetailMapper;
    /**
     * 工作台库存分页查询
     *
     * @param storeCashierProductPageQueryDTO
     * @return
     */
    public PageResult page(StoreCashierProductPageQueryDTO storeCashierProductPageQueryDTO) {
        //执行查询
        Page<StoreCashierProductVO> page=new Page<>(storeCashierProductPageQueryDTO.getPage(),storeCashierProductPageQueryDTO.getPageSize());

        page = productMapper.page(page, storeCashierProductPageQueryDTO);
        long total = page.getTotal();
        List<StoreCashierProductVO> records = page.getRecords();
        if (records == null || records.isEmpty()) {
            throw new BaseException("库存为空"); // 这里省略了异常信息，请补充"库存为空");
        };

        for (StoreCashierProductVO record : records) {
            String converted = SizeTypeUtil.convertSizeTypeToStr(Integer.parseInt(record.getSizeType()));
            record.setSizeType(converted);
        }
        return new PageResult(total,records);
    }

    /**
     * 工作台根据pId查询颜色和对应的id
     *
     * @param productCode
     * @return
     */
    public ListResult getPIdAndColorData(String productCode) {
        List<PIdAndColor> records=productMapper.getPIdAndColorData(productCode);
        return new ListResult( records);
    }

    /**
     * 工作台根据pId查询尺码和对应的pdId，并处理重复的尺码
     *
     * @param id 产品ID
     * @return 包含处理结果的ListResult
     */
    public ListResult getPdIdAndSizeTypeData(Long id) {
        List<PdIdAndSizeType> oldRecords = productDetailMapper.getPdIdAndSizeTypeData(id);
        Map<Integer, Map.Entry<Long, Integer>> sizeTypeCounts = new HashMap<>(); // 注意这里Map.Entry的值类型中的第一个Integer已经更改为Long

        // 使用Map.Entry<Long, Integer>作为值，其中Long是代表性的pid，Integer是计数
        for (PdIdAndSizeType oldRecord : oldRecords) {
            int sizeType = oldRecord.getSizeType();
            long pid = oldRecord.getPdId(); // 注意这里getPid()返回的是long类型

            // 检查sizeType是否已经在map中
            Map.Entry<Long, Integer> entry = sizeTypeCounts.get(sizeType);
            if (entry == null) {
                // 如果不在，创建一个新的Entry，pid作为key，计数为1
                entry = new AbstractMap.SimpleEntry<>(pid, 1);
                sizeTypeCounts.put(sizeType, entry);
            } else {
                // 如果在，增加计数
                entry.setValue(entry.getValue() + 1);
            }
        }

        List<PdIdAndSizeTypeVO> records = new ArrayList<>();

        // 根据统计结果创建新的PdIdAndSizeType对象并添加到records列表中
        for (Map.Entry<Integer, Map.Entry<Long, Integer>> outerEntry : sizeTypeCounts.entrySet()) {
            int sizeType = outerEntry.getKey();
            int total = outerEntry.getValue().getValue();
            long representativePid = outerEntry.getValue().getKey();

            PdIdAndSizeTypeVO newRecord = new PdIdAndSizeTypeVO();
            String sizeTypeStr = "";
            SizeTypeUtil.convertSizeTypeToStr(sizeType);
            newRecord.setSizeType(sizeTypeStr);
            newRecord.setTotal(total);
            // 设置代表性的pid
            newRecord.setPdId(representativePid);
            records.add(newRecord);
        }

        // 返回处理后的结果
        return new ListResult(records);
    }

}
